package com.yeban.javase.day18.test.test01;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @Desc TODO
 * @Author yeban
 * @Date 2025/11/2
 *
 * 需求：
 * 线程1要执行打印：A和C，线程2要执行打印：B，
 * 但线程1在打印A后，要线程2打印B之后才能打印C，
 * 所以：线程1在打印A后，必须等待线程2打印完B之后才能继续执行。
 *
 * 多线程的情况下 C -> B -> A
 * 阻塞队列LinkedBlockingQueue等等
 */
public class LinkedBlockingQueue1CBA {

    public static void main(String[] args) {

        LinkedBlockingQueue<Integer> queueCB = new LinkedBlockingQueue<>(); // C → B
        LinkedBlockingQueue<Integer> queueBA = new LinkedBlockingQueue<>(); // B → A

        ThreadPoolExecutor pool = new ThreadPoolExecutor(
                2,3,
                60L, TimeUnit.SECONDS,
                new LinkedBlockingQueue<Runnable>(2)
        );

        // 线程1：打印A和C
        pool.execute(() -> {
            try {
                System.out.println("C");
                // 通知可以执行B
                queueCB.put(1);

                // 等待B执行完的信号
                queueBA.take();
                System.out.println("A");
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });

        // 线程2：打印B
        pool.execute(() -> {
            try {
                queueCB.take();
                System.out.println("B");
                queueBA.put(1);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });

        // 关闭线程池
        pool.shutdown();
    }
}
